/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ch.fhnw.swa.aufgabenverwaltungswa.controller;

import ch.fhnw.swa.aufgabenverwaltungswa.business.MitarbeiterbearbeitungEJB;
import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Aufgabe;
import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Mitarbeiter;
import com.lowagie.text.Document;
import com.lowagie.text.PageSize;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

/**
 * Diese Klasse ist der Controller für die Mitarbeiterverwaltung.
 * Sie verwaltet die Aktionen und Eingaben von Mitarbeitern.
 * @author Tobias Neuenschwander
 * @author Benjamin Schatzmann
 * @author Edis Dilji
 * @author Francis Murillo
 */
@ManagedBean
@SessionScoped //SessionScope um die Möglichkeit zu haben eine Entity in einem Fenster auszuwählen und zwischenzuspeichern
               //um es in einem anderen Fenster wieder anzuzeigen
public class MitarbeiterController {
    //**************************************************************************
    //Variablen
    //**************************************************************************
    @EJB
    private MitarbeiterbearbeitungEJB mitarbeiterbearbeitungEJB;    //Sessionbean für Mitarbeiter
    private Mitarbeiter mitarbeiter = new Mitarbeiter();    //Mitarbeiter, welcher vom Benutzer gesehen, editiert oder erstellt wird
    private List<Mitarbeiter> mitarbeiterListe; //Liste aller Mitarbeiter, wird z.B. bei showEmployee angezeigt
    private ArrayList<String> taskList;         //Id's aller ausgewählten Aufgaben als String, welche einen Mitarbeiter zugeteilt sind
    private String erpMitarbeiterId;            //Id des ausgewählten Mitarbeiter, welche aus dem Erp gehohlt werden soll
    
    //**************************************************************************
    //Getter/Setter
    //**************************************************************************
    public MitarbeiterbearbeitungEJB getMitarbeiterbearbeitungEJB(){
        return mitarbeiterbearbeitungEJB;
    }

    public void setMitarbeiterbearbeitungEJB(MitarbeiterbearbeitungEJB mitarbeiterbearbeitungEJB) {
        this.mitarbeiterbearbeitungEJB = mitarbeiterbearbeitungEJB;
    }

    public Mitarbeiter getMitarbeiter() {
        return mitarbeiter;
    }

    public void setMitarbeiter(Mitarbeiter mitarbeiter) {
        this.mitarbeiter = mitarbeiter;
    }

    public List<Mitarbeiter> getMitarbeiterListe() {
        return mitarbeiterListe;
    }

    public void setMitarbeiterListe(List<Mitarbeiter> mitarbeiterListe) {
        this.mitarbeiterListe = mitarbeiterListe;
    }

    public ArrayList<String> getTaskList() {
        return taskList;
    }

    public void setTaskList(ArrayList<String> taskList) {
        this.taskList = taskList;
    }

    public String getErpMitarbeiterId() {
        return erpMitarbeiterId;
    }

    public void setErpMitarbeiterId(String erpMaList) {
        this.erpMitarbeiterId = erpMaList;
    }
    
    //**************************************************************************
    //Methoden
    //**************************************************************************
    /**
     * Diese Methode ruft das Mitarbeiterfenster (askEmployee.xhtml) auf und fuellt die Felder
     * mit den Daten der uebergebenen Mitarbeiterid
     * @param maIdEdit ID des zu editierenden Mitarbeiter
     * @return String mit dem case fuer die faces-config (askEmployee.xhtml)
     */
    public String doEditEmployee(Long maIdEdit){
        //Mitarbeiter hohlen
        mitarbeiter = mitarbeiterbearbeitungEJB.findEmployeeById(maIdEdit);
        //Liste der Id's aller zugeteilter Aufgaben fuellen
        fillTaskList();
        mitarbeiterListe = null;
        return ("caseAskEmployee");
    }
    
    /**
     * Diese Methode gibt den Auftrag den Mitarbeiter, dessen ID uebergeben wurde, zu loeschen
     * und ladet die Liste aller Mitarbeiter neu.
     * @param maIdDel ID des zu loeschenden Mitarbeiters
     */
    public void doDeleteEmployee(Long maIdDel){
        //Mitarbeiter loeschen
        mitarbeiterbearbeitungEJB.deleteEmployee(maIdDel);
        //Liste aller Mitarbeiter neu laden
        doLoadEmployeeList();
    }
    
    /**
     * Diese Methode gibt den Auftrag, einen Mitarbeiter zu speichern und ruft
     * danach die Seite auf, wo alle Mitarbeiter aufgelistet werden (showEmployee.xhtml).
     * @return String mit dem case fuer die faces-config (showEmployee.xhtml)
     */
    public String doSaveEmployee(){
        //Mitarbeiter speichern
        mitarbeiterbearbeitungEJB.saveEmployee(mitarbeiter, taskList);
        //Anzuzeigende Daten zuruecksetzten
        mitarbeiter = null;
        taskList = null;
        return(changeShowEmployee());
    }
    
    /**
     * Diese Methode hohlt alle Mitarbeiter und speichert sie in der Variable mitarbeiterListe
     */
    public void doLoadEmployeeList(){
        mitarbeiterListe = mitarbeiterbearbeitungEJB.loadEmployeeList();
    }
    
    /**Diese Methode hohlt alle Mitarbeiter und ruft die Seite auf,
     * wo alle Mitarbeiter aufgeleistet werden (showEmployee.xhtml)
     * @return String mit dem case fuer die faces-config (showEmployee.xhtml)
     */
    public String changeShowEmployee(){
        //Alle Mitarbeiter laden
        doLoadEmployeeList();
        return ("caseShowEmployee");
    }
    
    /**
     * Diese Methode erstellt einen neuen Mitarbeiter und zeigt die Seite an, wo
     * der Mitarbeiter erfasst werden kann.
     * @return String mit dem case fuer die faces-config (askEmployee.xhtml)
     */
    public String changeAskEmployee(){
        mitarbeiter = new Mitarbeiter();
        fillTaskList();
        return ("caseAskEmployee");
    }
    
    /**
     * Diese Methode fuellt die Daten eines Mitarbeiters mit den Daten des ueber den
     * Webservices importierten Daten. Dabei wird der Mitarbeiter, desen ID ausgewaehlt wurde, importiert
     */
    public void doFillMaFromERP(){
        //zugeteilte Aufgaben zwischnespeichern
        List<Aufgabe> tmpTaskList = mitarbeiter.getAufgabenZugeteilt();
        //Mitarbeiter importieren
        mitarbeiter = mitarbeiterbearbeitungEJB.getEmployeeWS(erpMitarbeiterId);
        //zugeteilte Aufgebn setzten
        mitarbeiter.setAufgabenZugeteilt(tmpTaskList);
    }
    
    /**
     * Diese Methode setzt die zu exportierde PDF-Seite auf Querformat
     * @param document zu exportierendes Dokument
     */
    public void preProcessPDF(Object document) {
        Document doc = (Document) document;
        doc.setPageSize(PageSize.A4.rotate());
    }
    
    /**
     * Diese Methode speichert die ID's aller des aktuell bearbeiteten Mitarbeiters zugetilten Aufgabe in die taskList.
     * Die ID's werden als String abgespeichert. Die Liste wird verwendet, da die Values der aus ausgewaehlten Aufgaben
     * vom UI als String verwaltet werden.
     */
    private void fillTaskList(){
        taskList = new ArrayList<String>();
        if (mitarbeiter != null && mitarbeiter.getAufgabenZugeteilt() != null){
            for (Aufgabe a : mitarbeiter.getAufgabenZugeteilt()){
               taskList.add(a.getId().toString());
            }
        }
    }
    
     /**
     * Diese Methode hohlt alle Aufgaben und erstellt daraus einen Array aus SelectItems fuer das UI
     * Der Value entspricht der Aufgabenid und das anzuzeigende Label dem Namen der Aufgabe.
     * @return Array von SelectItems
     */
    public SelectItem[] getAufgabenItems(){
        //Alle Aufgaben hohlen
        List<Aufgabe> taskList = mitarbeiterbearbeitungEJB.getTaskList();
        
        //Array von SelectItems erstellen. Der Value entspricht der Aufgabenid
        //und das Label dem Namen der Aufgabe
        SelectItem[] reArr = new SelectItem[taskList.size()];
        for(int i = 0; i < reArr.length; i++){
            reArr[i] = new SelectItem(taskList.get(i).getId(), taskList.get(i).getName());
        }
        return(reArr);
    }
    
     /**
     * Diese Methode hohlt alle Mitarbeiter aus dem ERP-System ueber den Webservice und erstellt daraus einen Array aus SelectItems fuer das UI
     * Der Value entspricht der Mitarbeiterid und das anzuzeigende Label der Mitarbeiterid, dem Vor- und Nachnamen eines Mitarbeiters.
     * @return Array von SelectItems
     */
    public SelectItem[] getERPMaItems(){
        //Alle Mitarbeiter aus dem ERP hohlen
        ArrayList<Mitarbeiter> maList = mitarbeiterbearbeitungEJB.getEmployeeListWS();
        
        //Array von SelectItems erstellen. Der Value entspricht der Mitarbeiterid
        //und das Label der Mitarbeiterid, dem Vor- und Nachnamen eines Mitarbeiters
        SelectItem[] reArr = new SelectItem[maList.size()];
        for(int i = 0; i < reArr.length; i++){
            String showString = maList.get(i).getId() + ": " + maList.get(i).getVorname() + " " + maList.get(i).getNachname();
            reArr[i] = new SelectItem(maList.get(i).getId(), showString);
        }
        return(reArr);
    }
}
